package pe.edu.sistemas.sisdiho.services;

import java.util.LinkedList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import pe.edu.sistemas.sisdiho.entities.HorarioClase;
import pe.edu.sistemas.sisdiho.repositories.HorarioClaseRepository;

@Service
@Transactional
public class HorarioClaseService {
	@Autowired
	private HorarioClaseRepository horarioClaseRepository;
	
	public List<HorarioClase> obtenerHorariosClase(){
		return horarioClaseRepository.obtenerHorariosClase();
	}
	
	public List<HorarioClase> obtenerHorariosClasexPeriodoyDia(String periodo, int dia){
		return horarioClaseRepository.obtenerHorariosClasexPeriodoyDia(periodo, dia);
	}
	
	public List<HorarioClase> obtenerHorariosClasexPeriodoxDiayHora(String periodo, int dia, String hInicio, String hFin){
		return horarioClaseRepository.obtenerHorariosClasexPeriodoxDiayHora(periodo, dia, hInicio, hFin);
	}
	
	public List<HorarioClase> obtenerHorariosxDiaxDocentexPeriodo(int dia,int idDocente,String periodo){
		return horarioClaseRepository.obtenerHorariosxDiaxDocentexPeriodo(dia,idDocente,periodo);
	}
	
	public List<HorarioClase> obtenerHorariosxGrupo(int grupoId){
		return horarioClaseRepository.obtenerHorariosxGrupo(grupoId);
	}
	/**
	 * Obtiene los horarios que tiene asignado un grupo.
	 * @param idGrupo ID del grupo.
	 * @param periodo Periodo en el cual el grupo tenga asignado horarios.
	 * @return Un Map que contenga como llave el dia y como contenido los horarios correspondientes al dia.
	 */
	public Map<Integer, List<HorarioClase>> obtenerHorariosOrdenadosxDiaxIdGrupo(int idGrupo, String periodo){
		List<Integer> list; 
		
		list = new LinkedList<Integer>();
		list.add(idGrupo);
		
		return obtenerHorariosOrdenadosxDiaxLista(list, periodo);
	}
	/**
	 * Obtiene los horarios que tiene asignado una lista de grupos.
	 * @param idGrupos Lista de ID's de los grupos.
	 * @param periodo Periodo en el cual los grupos tengan asignado horarios.
	 * @return Un Map que contenga como key el dia y como contenido los horarios correspondientes al dia.
	 */
	public Map<Integer, List<HorarioClase>> obtenerHorariosOrdenadosxDiaxLista(List<Integer> idGrupos, String periodo){
		Map<Integer, List<HorarioClase>> horarioMap;
		List<HorarioClase> horarios;
		List<HorarioClase> mapeado;
		
		horarioMap = new HashMap<Integer, List<HorarioClase>>();
		
		for(int idGrupo : idGrupos){
			horarios = horarioClaseRepository.obtenerHorariosxGrupoxPeriodo(idGrupo, periodo);
			
			for(HorarioClase horarioClase : horarios){
				if(horarioMap.containsKey(horarioClase.getDia())){
					mapeado = horarioMap.get(horarioClase.getDia());
				}else{
					mapeado = new LinkedList<HorarioClase>();
				}
				mapeado.add(horarioClase);
				horarioMap.put(horarioClase.getDia(), mapeado);
			}	
		}
		return horarioMap;
	}
	
	
	/***
	 * Obtiene los horarios ordenados x Dia en base al docente , a la escuela y al periodo
	 * @param idDocente Docente del cual obtendremos los horarios
	 * @param idEscuela Escuela de la que se va a hacer la busqueda
	 * @param periodo Periodo actual
	 * @return  Un Map que contenga como key el dia y como contenido los horarios correspondientes al dia.
	 */
public Map<Integer, List<HorarioClase>> obtenerHorariosOrdenadosEnDiasxDocentexPeriodoxEscuela(int idDocente,int idEscuela,String periodo){
		
		Map<Integer, List<HorarioClase>> horarioMap;
		List<HorarioClase> horarios;
		List<HorarioClase> mapeado;
		//obtener horarios ordenados x dia x escuela
		horarios = horarioClaseRepository.obtenerHorariosOrdenadosxDiaxDocentexEscuelaxPeriodo(idDocente, idEscuela, periodo);
		horarioMap = new HashMap<Integer, List<HorarioClase>>();
		for(HorarioClase horarioClase : horarios){
			System.out.println(horarioClase.getDia()+"  "+horarioClase.getIdDocente()+ " "+horarioClase.getIdHorarioClase() +" "+horarioClase.getHorarioClaseTipo()+
					" "+ horarioClase.getIdGrupo()+"");
			if(horarioMap.containsKey(horarioClase.getDia())){
				mapeado = horarioMap.get(horarioClase.getDia());
			}else{
				mapeado = new LinkedList<HorarioClase>();
			}
			mapeado.add(horarioClase);
			horarioMap.put(horarioClase.getDia(), mapeado);
		}
		return horarioMap;
	}

}

